# 如果一个函数的内部定义了另外一个函数,那外部的函数叫做外函数,内部的函数叫做内函数.
# 如果在一个外部函数中定义了一个内部函数,并且外部函数的返回值是内部函数,这样就构成了一个闭包. 内部函数被称为闭包函数.

'''
闭包函数的条件:
1.必须是函数嵌套函数
2.内部函数必须引用一个定义在闭合范围外的外部函数的变量
3.外部函数必须返回内部函数
'''

# 最简单的闭包函数
# 外部函数
def outer():
    # 内部函数
    def inner():
        print("哈哈哈")
    # 将内部函数返回
    return inner
fn = outer()  #   fn <====> inner函数
# fn()   # 相当于调用了inner函数


# 2.定义一个闭包. 内部函数调用了外部函数的变量
# 外部函数
def outer1(b):
    a = 10
    # 内部函数
    def inner1():
        # 在内部函数中使用外部函数的变量
        print(a + b)
    return inner1   # 将定义的内部函数返回

func1 = outer1(98)
print(func1)   # <function outer1.<locals>.inner1 at 0x000002692C01B2E0>
# func1()  # 108
# 闭包函数的应用场景是: 装饰器


